{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练流程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 数据准备\n",
    "    - 数据探索<br>\n",
    "    train训练集下有100个目录，每个目录代表一个汉字，目录下字体有不同的书写方式，test测试集一级目录下包含不同的汉字图片 所有图片为单通道，宽高不一致\n",
    "    - 数据筛选<br>\n",
    "    数据已经清理过，没有无效的数据\n",
    "    - 预处理（集成在训练过程中）<br>\n",
    "    - 打包<br>\n",
    "    tensorflow支持tfrecord格式的数据转换，可以把很多小文件打包成大文件，提高磁盘读取效率<br>\n",
    "    打包命令及结果如下图所示：\n",
    "    \n",
    "    <img src=\"./images/数据打包.jpg\"><br>\n",
    "    数据集切分为训练集3万张图片，验证集1万张图片<br>\n",
    " * 训练/调参<br>\n",
    "    - 首先下载imagenet上预训练的inception_v3的文件\n",
    "    - 将数据集和代码文件复制到GPU机器上\n",
    "    - 指定模型训练参数：包括训练文件名(train_image_classifier.py)，数据集名称(quiz)，数据集目录(./train)，预训练模型(inception_v3.ckpt),训练模型（inception_v3），需排除参数的命名空间（由于imageNet上的分类有1000个输出，而本次汉字书法识别任务有100个输出，因此需要丢弃掉一些权重，这些权重所在命名空间为inceptionV3/Logits.InceptionV3/AuxLogits），记录summary文件目录（./train），学习率（finetune一个模型的时候，由于参数初始为比较好的状态，因此学习率设置小一点，为0.001），优化器（rmsprop），batch_size(这里设置一次输入32张图片)<br>\n",
    "    下图为训练过程中输出的信息：\n",
    "    <img src=\"./images/模型训练.jpg\"><br>\n",
    "    从图中看出每一次训练耗时大约1.1s，完成一个epoch大约需要30000/32*1.1/60=17分钟<br>\n",
    " * 验证\n",
    "     - 开启另一个终端连接实验室服务器，同时进行训练和验证，当验证的准确率和召回率都比较高时就停止训练，由于gpu的显存几乎都用于模型训练了，因此通过export CUDA_VISIBLE_DEVICES=\"\"命令来使用GPU进行验证<br>\n",
    "     - 参数：验证文件(eval_image_classifier.py)，数据集名称(quiz)，数据集目录(./train),dataset_split_name(validation)，训练模型(inception_v3)，验证模型(./train下的保存的最新的ckpt文件)，验证时summary写入目录(./eval),batchsize(一次输入32张图片),max_num_batch(在验证时验证集也比较大，我们可以不适用全部数据，可以指定最大的batch数，这里指定为128，因此验证的数据为128*32=4096张图片，差不多半个数据集做验证)\n",
    "     - 下图为验证训练23901步保存的模型：<br>\n",
    "    <img src=\"./images/模型验证.png\"><br>\n",
    "    Top1(Accuracy)达到了93%以上，Top5（Recall）达到了98%以上，模型效果非常好。<br>\n",
    "* 模型导出\n",
    "* 模型使用\n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## tensorboard解读"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 损失函数\n",
    "<img src=\"./images/tensorboard-losses.jpg\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从损失函数看，后面损失波动有点大，出现了一点点回升，学习率可以设置的再小一些，模型还未收敛，继续训练，损失还有减小的余地。\n",
    "* 模型稀疏度\n",
    "<img src=\"./images/tensorboard-sparsity.jpg\"><br>\n",
    "稀疏度在上升，说明模型系数变得稀疏，模型越来越简单，说明模型泛化能力越强。<br>\n",
    "* graph\n",
    "<img src=\"./images/tensorboard-graph.png\"><br>\n",
    "展现了inception_v3的图结构以及反向传播的图结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
